package com.hjy.backend.versionManager;


import com.hjy.backend.dataManager.DataManager;
import com.hjy.backend.transactionManager.TransactionManager;

public interface VersionManager {
    /**
     * 读取一个 entry 的数据
     *
     * @param xid
     * @param uid
     * @return
     * @throws Exception
     */
    byte[] read(long xid, long uid) throws Exception;

    /**
     * 一个事务的一个操作产生的数据插入到数据文件中
     *
     * @param xid
     * @param data
     * @return
     * @throws Exception
     */
    long insert(long xid, byte[] data) throws Exception;

    /**
     * uid对应的entry标识为被事务xid删除
     * 一是可见性判断，二是获取资源的锁，三是版本跳跃判断。删除的操作只有一个设置 XMAX。
     *
     * @param xid
     * @param uid
     * @return
     * @throws Exception
     */
    boolean delete(long xid, long uid) throws Exception;

    /**
     * begin() 开启一个事务，并初始化事务的结构，将其存放在 activeTransaction 中，用于检查和快照使用：
     *
     * @param level
     * @return
     */
    long begin(int level);

    /**
     * commit() 方法提交一个事务，主要就是 free 掉相关的结构，并且释放持有的锁，并修改 TM 状态：
     *
     * @param xid
     * @throws Exception
     */
    void commit(long xid) throws Exception;

    /**
     * 撤销一个事务
     *
     * @param xid
     */
    void abort(long xid);

    public static VersionManager newVersionManager(TransactionManager tm, DataManager dm) {
        return new VersionManagerImpl(tm, dm);
    }

}
